package com.jet.goods.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jet.core.utils.IdUtil;
import com.jet.goods.domain.dto.SkuSpecDto;
import com.jet.goods.domain.entity.GoodsSkuSpec;
import com.jet.goods.domain.vo.SkuSpecVo;
import com.jet.goods.mapper.GoodsSkuSpecMapper;
import com.jet.goods.service.IGoodsSkuSpecService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author author
 * @since 2025-03-04
 */
@Service
@Slf4j
public class GoodsSkuSpecServiceImpl extends ServiceImpl<GoodsSkuSpecMapper, GoodsSkuSpec> implements IGoodsSkuSpecService {

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void batchSave(String spuId, String skuId, List<SkuSpecDto> dtos) {
        List<SkuSpecVo> list = findAllBySkuId(skuId);
        dtos.forEach(x -> {
            SkuSpecVo skuSpecVo = list.stream().filter(y -> y.getSpecValueId().equals(x.getSpecValueId()))
                    .findFirst().orElse(null);
            if (skuSpecVo == null) {
                log.info("保存商品规格信息：spu:{},sku:{}", spuId, skuId);
                save(spuId, skuId, x);
            }
        });
    }

    @Override
    public void save(String spuId, String skuId, SkuSpecDto dto) {
        GoodsSkuSpec entity = new GoodsSkuSpec();
        entity.setId(IdUtil.generateLower());
        entity.setSpuId(spuId);
        entity.setSkuId(skuId);
        entity.setSpecId(dto.getSpecId());
        entity.setSpecName(dto.getSpecName());
        entity.setSpecValueId(dto.getSpecValueId());
        entity.setSpecValueName(dto.getSpecValueName());
        super.save(entity);
    }

    @Override
    public void deleteBySpuId(String spuId) {
        Wrapper<GoodsSkuSpec> wrapper = new LambdaQueryWrapper<GoodsSkuSpec>()
                .eq(GoodsSkuSpec::getSpuId, spuId);
        super.remove(wrapper);
    }

    @Override
    public void deleteBySkuId(String skuId) {
        Wrapper<GoodsSkuSpec> wrapper = new LambdaQueryWrapper<GoodsSkuSpec>()
                .eq(GoodsSkuSpec::getSkuId, skuId);
        super.remove(wrapper);
    }

    @Override
    public List<SkuSpecVo> findAllBySpuId(String spuId, String skuId) {
        Wrapper<GoodsSkuSpec> wrapper = new LambdaQueryWrapper<GoodsSkuSpec>()
                .eq(GoodsSkuSpec::getSpuId, spuId)
                .eq(GoodsSkuSpec::getSkuId, skuId);
        List<GoodsSkuSpec> list = super.list(wrapper);
        return list.stream().map(x -> {
            SkuSpecVo vo = new SkuSpecVo();
            BeanUtils.copyProperties(x, vo);
            return vo;
        }).collect(Collectors.toList());
    }

    @Override
    public List<SkuSpecVo> findAllBySkuId(String skuId) {
        Wrapper<GoodsSkuSpec> wrapper = new LambdaQueryWrapper<GoodsSkuSpec>()
                .eq(GoodsSkuSpec::getSkuId, skuId);
        List<GoodsSkuSpec> list = super.list(wrapper);
        return list.stream().map(x -> {
            SkuSpecVo vo = new SkuSpecVo();
            BeanUtils.copyProperties(x, vo);
            return vo;
        }).collect(Collectors.toList());
    }

    @Override
    public List<SkuSpecVo> findAllBySkuIds(List<String> skuIds) {
        if (CollectionUtils.isEmpty(skuIds)) {
            return Collections.emptyList();
        }
        Wrapper<GoodsSkuSpec> wrapper = new LambdaQueryWrapper<GoodsSkuSpec>()
                .in(GoodsSkuSpec::getSkuId, skuIds);
        List<GoodsSkuSpec> list = super.list(wrapper);
        return list.stream().map(x -> {
            SkuSpecVo vo = new SkuSpecVo();
            BeanUtils.copyProperties(x, vo);
            return vo;
        }).collect(Collectors.toList());
    }

    @Override
    public List<SkuSpecVo> findAllBySpuIds(List<String> spuIds) {
        if (CollectionUtils.isEmpty(spuIds)) {
            return Collections.emptyList();
        }
        Wrapper<GoodsSkuSpec> wrapper = new LambdaQueryWrapper<GoodsSkuSpec>()
                .in(GoodsSkuSpec::getSpuId, spuIds);
        List<GoodsSkuSpec> list = super.list(wrapper);
        return list.stream().map(x -> {
            SkuSpecVo vo = new SkuSpecVo();
            BeanUtils.copyProperties(x, vo);
            return vo;
        }).collect(Collectors.toList());
    }

    @Override
    public List<GoodsSkuSpec> findAllBySpecId(String specId) {
        Wrapper<GoodsSkuSpec> wrapper = new LambdaQueryWrapper<GoodsSkuSpec>()
                .eq(GoodsSkuSpec::getSpecId, specId);
        return super.list(wrapper);
    }
}
